import numpy as np
%matplotlib notebook
import matplotlib.pyplot as plt
import ipywidgets as widgets
from maux import *
hide_interactive_toolbars()
# interaktívny editor pre vyšetrovanie priebehu elementárnych funkcií
from jedit import editor
np.warnings.filterwarnings('ignore', category=np.VisibleDeprecationWarning)
# nastavenie jazyka
from locale import setlocale, LC_ALL
from platform import uname
if uname()[0] == 'Linux':
setlocale(LC_ALL, 'sk_SK.utf8')
else:
setlocale(LC_ALL, 'sk_SK')
plt.rcParams["axes.formatter.use_locale"] = True
Polynomiálna funkcia je určená rovnicou $$y = a_n x^n + a_{n-1} x^{n-1} + \cdots a_2 x^2 + a_1 x + a_0,$$ kde $a_n, a_{n-1}, \ldots, a_2, a_1, a_0$ sú reálne čísla. Definičným oborom je množina reálnych čísel. Konštantné, lineárne a kvadratické funkcie sú špeciálnym prípadom polynomiálnych funkcií.
Nakreslenie grafu polynomiálnej funkcie danej rovnicou $$y = 2x^4-7x^3+5x^2+3x-2.$$
#####
##### nakreslenie grafu funkcie
#####
#### vstupné údaje
def f(X): return 2 * X ** 4 - 7 * X ** 3 + 5 * X ** 2 + 3 * X - 2 # ufunc verzia funkcie
X = np.linspace(-0.70, 2.20, 29*100+1) # výber hodnôt nezávislej premennej pre zaujímavú časť grafu
Y = f(X) # odpovedajúce hodnoty závislej premennej
#### obrázok s jedným diagramom
fig, ax = plt.subplots()
fig.set_size_inches(7, 9) # veľkosť obrázka (východzia hodnota je 6x4)
### diagram
init_subplot(ax) # inicializácia diagramu: vytvorí sa pravoúhla súradnicová sústava
ax.set_title(r"Graf funkcie $y = 2x^4-7x^3+5x^2+3x-2$") # pomenovanie diagramu
ax.set_aspect('equal') # nastavenie rovnakej mierky pre obe osi
# ax.grid() # pravoúhla sieť
## graf funkcie
ax.plot(X, Y)
### archivácia obrázka
# fig.savefig("<meno súboru>.png")
### samotné zobrazenie
fig.show()
Vyšetrenie priebehu polynomiálnej funkcie danej rovnicou $$y = 2x^4-7x^3+5x^2+3x-2.$$ Tu nás zaujímajú tieto informácie:
Ukážeme si dva spôsoby, ako vyšetriť priebeh funkcie. Preferujeme ten, ktorý používa algebraické argumenty.
Presnosť tejto metódy závisí od jemnosti delenia základného intervalu, tu reprezentovaného poľom X
.
Čím je delenie intervalu jemnejšie, tým je presnosť získaných údajov lepšia.
Funkcia má na zvolenom intervale štyri nulové body, Ich približné x-ové súradnice vypočítame takto:
>>> X[np.abs(f(X)) <= 0.001]
Výsledok je array([-0.618, 0.5 , 1.618, 2. ])
.
Funkcia nadobúda ostré minimum na intervale $\left\langle -\frac{1}{2}, 0 \right\rangle$. Jeho približnú x-ovú súradnicu vypočítame takto:
>>> I = X[(X >= -1/2) & (X <= 0)]
>>> I[f(I).argmin()]
Výsledok po zaúkrohlení je -0.205
.
Funkcia nadobúda ostré lokálne minimum na intervale $\left\langle \frac{3}{2}, 2 \right\rangle$. Jeho približnú x-ovú súradnicu vypočítame takto:
>>> I = X[(X >= 3/2) & (X <= 2)]
>>> I[f(I).argmin()]
Výsledok po zaúkrohlení je 1.83
.
Súradnice ostatných význačných bodov sú zrejmé z obrázka.
Ako alternatívnu metódu doporučujeme použiť interaktívny editor pre vyšetrovanie priebehu elementárnych funkcií. Príkaz potrebný pre inicializáciu editora má tvar
>>> editor(figure=fig, axes=ax, function=f, intervals=[X])
Používanie interaktívneho prostredia je intuitívne zrejmé. Autorom editora je náš bývalý študent Juraj Vetrák. Je to upravená verzia softvéru z jeho bakalárskej práce. Spätná väzba je vždy vítaná. Ak narazite na nejaký problém, ozvite sa.
editor(figure=fig, axes=ax, function=f, intervals=[X])
#####
##### vyšetrenie priebehu funkcie (numerické riešenie)
#####
#### vstupné údaje
def f(X): return 2 * X ** 4 - 7 * X ** 3 + 5 * X ** 2 + 3 * X - 2 # ufunc verzia funkcie
X = np.linspace(-0.70, 2.20, 29*100+1) # výber hodnôt nezávislej premennej pre zaujímavú časť grafu
Y = f(X) # odpovedajúce hodnoty závislej premennej
#### obrázok s jedným diagramom
fig, ax = plt.subplots()
fig.set_size_inches(7, 9) # veľkosť obrázka (východzia hodnota je 6x4)
### diagram
init_subplot(ax) # inicializácia diagramu: vytvorí sa pravoúhla súradnicová sústava
ax.set_title(r"Priebeh funkcie $y = 2x^4-7x^3+5x^2+3x-2$") # pomenovanie diagramu
ax.set_aspect('equal') # nastavenie rovnakej mierky pre obe osi
ax.grid() # pravoúhla sieť
## nulové body funkcie
ax.plot([(1-np.sqrt(5))/2, 1/2, (1+np.sqrt(5))/2, 2], [0, 0, 0, 0], 'kx', label=r"nulové body $-0,\!618$, $\frac{1}{2}$, $1,\!618$ a $2$")
## x-ové súradnice extrémov funkcie vrátane krajných bodov základného intervalu
ps = [X[0], -0.205, 1, 1.83, X[-1]]
## extrémy funkcie
ax.plot(ps[1], f(ps[1]), 'o', label=r"ostré minimum v bode $-0,\!205$")
ax.plot(ps[2], f(ps[2]), 'o', label=r"ostré lokálne maximum")
ax.plot(ps[3], f(ps[3]), 'o', label=r"ostré lokálne minimum v bode $1,\!83$")
## intervaly, na ktorých je funkcia klesajúca
color = ax.plot([], [], label=r"klesajúca")[0].get_color()
for i in [0, 2]:
I = X[(ps[i] <= X) & (X <= ps[i+1])]
ax.plot(I, f(I), c=color, zorder=1)
## intervaly, na ktorých je funkcia rastúca
color = ax.plot([], [], label=r"rastúca")[0].get_color()
for i in [1, 3]:
I = X[(ps[i] <= X) & (X <= ps[i+1])]
ax.plot(I, f(I), c=color, zorder=1)
## legenda
ax.legend()
### archivácia obrázka
# fig.savefig("<meno súboru>.png")
### samotné zobrazenie
fig.show()
Dva nulové body sú zrejmé z obrázka. Sú to čísla $\frac{1}{2}$ a $2$. Zvyšné dva nulové body získame touto úpravou $$ 2x^4-7x^3+5x^2+3x-2 = (x-2)(2x^3-3x^2-x+1) = (x-2)(2x-1)(x^2-x-1) = (x-2)(2x-1)\left(x-\frac{1+\sqrt{5}}{2}\right)\left(x-\frac{1-\sqrt{5}}{2}\right). $$ Nulové body funkcie sú tak čísla $\frac{1-\sqrt{5}}{2}$, $\frac{1}{2}$, $\frac{1+\sqrt{5}}{2}$ a $2$.
Jeden extrém funkcie je zrejmý z obrázka. Je to ostré lokálne maximum v bode $1$. Zvyšné dva extrémy nájdeme pomocou jej derivácie $y'$. Je to funkcia definovaná predpisom $$y'(x) = 8x^3-21x^2+10x+3.$$ V bodoch, kde nadobúda funkcia lokálny extrém, je jej derivácia nulová. Jeden nulový bod derivácie už poznáme, je ním číslo $1$. Ostatné nulové body získame touto úpravou $$ 8x^3-21x^2+10x+3 = (x-1)(8x^2-13x-3) = 8(x-1)\left(x-\frac{13+\sqrt{265}}{16}\right)\left(x-\frac{13-\sqrt{265}}{16}\right). $$ Funkcia tak nadobúda extrémy v týchto bodoch $\frac{13-\sqrt{265}}{16}$, $1$ a $\frac{13+\sqrt{265}}{16}$.
Poznámka. Nasledujúci obrázok obsahuje graf derivácie $y'$. Všimnime si, že tentokrát sme použili inú mierku pre každú zo súradnicových osí.
#####
##### vyšetrenie priebehu funkcie (algebraické riešenie)
#####
#### vstupné údaje
def f(X): return 2 * X ** 4 - 7 * X ** 3 + 5 * X ** 2 + 3 * X - 2 # ufunc verzia funkcie
X = np.linspace(-0.70, 2.20, 29*100+1) # výber hodnôt nezávislej premennej pre zaujímavú časť grafu
Y = f(X) # odpovedajúce hodnoty závislej premennej
#### obrázok s jedným diagramom
fig, ax = plt.subplots()
fig.set_size_inches(7, 9) # veľkosť obrázka (východzia hodnota je 6x4)
### diagram
init_subplot(ax) # inicializácia diagramu: vytvorí sa pravoúhla súradnicová sústava
ax.set_title(r"Priebeh funkcie $y = 2x^4-7x^3+5x^2+3x-2$") # pomenovanie diagramu
ax.set_aspect('equal') # nastavenie rovnakej mierky pre obe osi
ax.grid() # pravoúhla sieť
## nulové body funkcie
ax.plot([(1-np.sqrt(5))/2, 1/2, (1+np.sqrt(5))/2, 2], [0, 0, 0, 0], 'kx', label=r"nulové body $\frac{1-\sqrt{5}}{2}$, $\frac{1}{2}$, $\frac{1+\sqrt{5}}{2}$ a $2$")
## x-ové súradnice extrémov funkcie vrátane krajných bodov základného intervalu
ps = [X[0], (13-np.sqrt(265))/16, 1, (13+np.sqrt(265))/16, X[-1]]
## extrémy funkcie
ax.plot(ps[1], f(ps[1]), 'o', label=r"ostré minimum v bode $\frac{13-\sqrt{265}}{16}$")
ax.plot(ps[2], f(ps[2]), 'o', label=r"ostré lokálne maximum")
ax.plot(ps[3], f(ps[3]), 'o', label=r"ostré lokálne minimum v bode $\frac{13+\sqrt{265}}{16}$")
## intervaly, na ktorých je funkcia klesajúca
color = ax.plot([], [], label=r"klesajúca")[0].get_color()
for i in [0, 2]:
I = X[(ps[i] <= X) & (X <= ps[i+1])]
ax.plot(I, f(I), c=color, zorder=1)
## intervaly, na ktorých je funkcia rastúca
color = ax.plot([], [], label=r"rastúca")[0].get_color()
for i in [1, 3]:
I = X[(ps[i] <= X) & (X <= ps[i+1])]
ax.plot(I, f(I), c=color, zorder=1)
## legenda
ax.legend()
### archivácia obrázka
# fig.savefig("<meno súboru>.png")
### samotné zobrazenie
fig.show()
V nasledujúcich príkladoch budeme kresliť grafy a vyšetrovať priebeh polynomiálnych funkcií. Pretože tieto funkcie majú neohraničený definičný obor, budeme pri zostrojovaní grafu každej takejto funkcie vykreslovať len jej zaujímavú časť. Pri vyšetrovani priebehu týchto funkcií treba určiť:
Preferujeme algebraickú metódu pri hľadaní význačných bodov. Súradnice význačných bodov, ktoré sú zrejmé z grafu, netreba explicitne uvádzať.
Doporučujeme rozdeliť riešenie do dvoch častí:
#####
##### šablóna riešenia I (nakreslenie grafu a vyšetrenie priebehu funkcie)
#####
#### vstupné údaje
# def f(X): return None # ufunc verzia funkcie
# X = np.linspace(None, None, None+1) # výber hodnôt nezávislej premennej pre zaujímavú časť grafu
# Y = f(X) # odpovedajúce hodnoty závislej premennej
#### obrázok s jedným diagramom
# fig, ax = plt.subplots()
# fig.set_size_inches(6, 4) # veľkosť obrázka (východzia hodnota je 6x4)
### diagram
# init_subplot(ax) # inicializácia diagramu: vytvorí sa pravoúhla súradnicová sústava
# ax.set_title(r"Graf funkcie $y = \cdots$") # pomenovanie diagramu
# ax.set_title(r"Priebeh funkcie $y = \cdots$") # pomenovanie diagramu
# ax.set_aspect('equal') # nastavenie rovnakej mierky pre obe osi
# ax.grid() # pravoúhla sieť
## graf funkcie
# ax.plot(X, Y)
## nulové body funkcie
# ax.plot(None, 0, 'kx', label=r"nulový bod $?$")
## extrémy funkcie
# ax.plot(None, f(None), 'o', label=r"extrém v bode $?$")
## monotónnosť funkcie
# X1 = X[(None <= X) & (X <= None)] # interval, na ktorom je funkcia monotónna
# ax.plot(X1, f(X1), label=r"monotónna", zorder=1)
## legenda
# ax.legend()
# ax.legend(loc='center') # umiestenie v strede diagramu
### archivácia obrázka
# fig.savefig("<meno súboru>.png")
### samotné zobrazenie
# fig.show()
#### editor
# editor(figure=fig, axes=ax, function=f, intervals=[X])
#####
##### šablóna riešenia II (nakreslenie grafu a vyšetrenie priebehu funkcie)
#####
#### vstupné údaje
# def f(X): return None # ufunc verzia funkcie
# X = np.linspace(None, None, None+1) # výber hodnôt nezávislej premennej pre zaujímavú časť grafu
# Y = f(X) # odpovedajúce hodnoty závislej premennej
#### obrázok s jedným diagramom
# fig, ax = plt.subplots()
# fig.set_size_inches(6, 4) # veľkosť obrázka (východzia hodnota je 6x4)
### diagram
# init_subplot(ax) # inicializácia diagramu: vytvorí sa pravoúhla súradnicová sústava
# ax.set_title(r"Graf funkcie $y = \cdots$") # pomenovanie diagramu
# ax.set_title(r"Priebeh funkcie $y = \cdots$") # pomenovanie diagramu
# ax.set_aspect('equal') # nastavenie rovnakej mierky pre obe osi
# ax.grid() # pravoúhla sieť
## graf funkcie
# ax.plot(X, Y)
## nulové body funkcie
# ax.plot(None, 0, 'kx', label=r"nulový bod $?$")
## x-ové súradnice extrémov funkcie vrátane krajných bodov základného intervalu
# ps = [X[0], None, X[-1]]
## extrémy funkcie
# ax.plot(None, f(None), 'o', label=r"extrém v bode $?$")
## intervaly, na ktorých je funkcia monotónna
# color = ax.plot([], [], label=r"monotónna")[0].get_color()
# for i in None:
# I = X[(ps[i] <= X) & (X <= ps[i+1])]
# ax.plot(I, f(I), c=color, zorder=1)
## legenda
# ax.legend()
# ax.legend(loc='center') # umiestenie v strede diagramu
### archivácia obrázka
# fig.savefig("<meno súboru>.png")
### samotné zobrazenie
# fig.show()
#### editor
# editor(figure=fig, axes=ax, function=f, intervals=[X])
Nakreslite grafy a vyšetrite priebeh týchto funkcií $$y = x^3+3x^2-9x-10,$$ $$y = x^4-4x^3,$$ $$y = x^4-x^2-2,$$ $$y = x^4-2x^2,$$ $$y = x^3-x.$$
Nakreslite graf a vyšetrite priebeh funkcie $$y = -2x^3+3x^2+x-1.$$ Návod. Derivácia $y'$ funkcie ma tento predpis $$y'(x) = -6x^2+6x+1.$$
Nakreslite graf a vyšetrite priebeh funkcie $$y = -x^4-2x^3+3x^2+4x.$$ Návod. Derivácia $y'$ funkcie ma tento predpis $$y'(x) = -4x^3-6x^2+6x+4.$$
V nasledujúcom príklade si ukážeme, ako kresliť grafy parametrických systémov polynomiálnych funkcií.
Vykreslenie sa deje pomocou interaktívnych prvkov knižnice ipywidgets
.
Dokumentácia:
Nakreslenie grafu kubickej funkcie danej rovnicou v štandardnom tvare $$y = ax^3+bx^2+cx+d$$ pre vybrané hodnoty parametrov $a,b,c,d$.
#####
##### grafy parametrického systému funkcií (interaktívna verzia)
#####
#### vstupné údaje
def f(X, a, b, c, d): return a * X ** 3 + b * X ** 2 + c * X + d
X = np.linspace(-3, 3, 6*10+1)
#### obrázok s jedným diagramom
fig, ax = plt.subplots()
fig.set_size_inches(6, 9)
### diagram
init_subplot(ax)
ax.grid()
## graf funkcie y = ax³+bx²+cx+d
def plot_graph(a, b, c, d):
ax.set_title(r"Graf funkcie $y = {0}{{x}}^3+{1}{{x}}^2+{2}{{x}}+{3}$".format(a, b, c, d))
if ax.lines:
ax.lines[0].set_ydata(f(X, a, b, c, d))
else:
ax.plot(X, f(X, 1, 0, 0, 0))
widgets.interact(plot_graph,
a=widgets.FloatSlider(min=-2, max=2, value=1, step=0.1),
b=widgets.FloatSlider(min=-2, max=2, value=0, step=0.1),
c=widgets.FloatSlider(min=-2, max=2, value=0, step=0.1),
d=widgets.FloatSlider(min=-2, max=2, value=0, step=0.1),
)
### samotné zobrazenie
fig.show()